package com.monkeyboy.list;

import com.monkeyboy.ListNode;

/**
 * 删除链表中的重复节点
 * 题目：
 * 在一个排序的链表中，存在重复的结点，请删除该链表中重复的结点，重复的结点不保留，返回链表头指针。
 * 例如，链表1->2->3->3->4->4->5 处理后为 1->2->5
 * <p>
 * 下面是通过递归删除的
 * 另一种办法就是先遍历一遍，把重复的元素放到hashSet里面，然后再遍历一遍，把相同的删除掉
 *
 * @Author Gavin
 * @date 2021.04.02 10:31
 */
public class List03 {

    public static ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null || pHead.next == null) { // 只有0个或1个结点，则返回
            return pHead;
        }
        if (pHead.val == pHead.next.val) { // 当前结点是重复结点
            ListNode pNode = pHead.next;
            while (pNode != null && pNode.val == pHead.val) {
                // 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点
                pNode = pNode.next;
            }
            return deleteDuplication(pNode); // 从第一个与当前结点不同的结点开始递归
        } else { // 当前结点不是重复结点
            pHead.next = deleteDuplication(pHead.next); // 保留当前结点，从下一个结点开始递归
            return pHead;
        }
    }


    public static void main(String[] args) {

    }
}
